package com.fire.core.util;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

/**
 * 
 * @author yuanchong
 *
 */
public class BmiDateUtil {

    /**
     * 日期格式，年月日，用横杠分开，例如：2006-12-25，2008-08-08
     */
    public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";

    /**
     * 日期格式，年月日时分秒，年月日用横杠分开，时分秒用冒号分开 例如：2005-05-10 23：20：00，2008-08-08 20:08:08
     */
    public static final String DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS = "yyyy-MM-dd HH:mm:ss";

    /**
     * 时间格式，时分秒用冒号分开 例如：23：20：00，20:08:08
     */
    public static final String DATE_TIME_FORMAT_HH_MI_SS = "HH:mm:ss";

    /**
     * 获取两个日期间的年数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int getYears(String date1, String date2) {
        Date dateObj1 = null;
        Date dateObj2 = null;
        try {
            dateObj1 = DateUtils.parseDate(date1, DATE_FORMAT_YYYY_MM_DD);
            dateObj2 = StringUtils.isBlank(date2) ? new Date() : DateUtils
                    .parseDate(date2, DATE_FORMAT_YYYY_MM_DD);
        } catch (ParseException e) {
            throw new IllegalArgumentException("日期格式错误，必须传入yyyy-MM-dd的日期字符串");
        }

        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(dateObj1);
        c2.setTime(dateObj2);
		/*
		 * if (c2.get(Calendar.MONTH) == 1 && c2.get(Calendar.DATE) == 28) { //
		 * date2是2月28号 if (isLeapYear(c2) && !isLeapYear(c1)) { //
		 * date1不是闰年，date2是闰年 c2.add(Calendar.DATE, -1); } }
		 */
        if (c1.get(Calendar.MONTH) == 1 && c1.get(Calendar.DATE) == 29) { // date1是2月29号
            if (!isLeapYear(c2) && isLeapYear(c1)) { // date1是闰年，date2不是闰年
                c1.add(Calendar.DATE, -1);
            }
        }
        int yearNow = c2.get(Calendar.YEAR);
        int monthNow = c2.get(Calendar.MONTH);
        int dayOfMonthNow = c2.get(Calendar.DAY_OF_MONTH);

        int yearBirth = c1.get(Calendar.YEAR);
        int monthBirth = c1.get(Calendar.MONTH);
        int dayOfMonthBirth = c1.get(Calendar.DAY_OF_MONTH);
        int age = yearNow - yearBirth;
        if (monthNow <= monthBirth) {
            if (monthNow == monthBirth) {
                if (dayOfMonthNow < dayOfMonthBirth) {
                    age--;
                }

            } else {
                age--;
            }
        }
        return age;
    }

    /**
     * 获取两个日期间的天数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int getDays(String date1, String date2) {
        Date dateObj1 = null;
        Date dateObj2 = null;
        try {
            dateObj1 = DateUtils.parseDate(date1, DATE_FORMAT_YYYY_MM_DD);
            if (StringUtils.isBlank(date2)) {
                date2 = DateFormatUtils.format(new Date(), DATE_FORMAT_YYYY_MM_DD);
            }
            dateObj2 = DateUtils.parseDate(date2, DATE_FORMAT_YYYY_MM_DD);
        } catch (ParseException e) {
            throw new IllegalArgumentException("日期格式错误，必须传入yyyy-MM-dd的日期字符串");
        }

        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(dateObj1);
        c2.setTime(dateObj2);

        int days = 0;
        while (c2.after(c1)) { // 循环对比，直到相等
            days++;
            c1.add(Calendar.DATE, 1);
        }
        return days;
    }

    /**
     * 是否闰年
     *
     * @return
     */
    private static boolean isLeapYear(Calendar calendar) {
        int year = calendar.get(Calendar.YEAR);
        return year % 100 == 0 ? year % 400 == 0 : year % 4 == 0;
    }
}
